<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>异步</title>
</head>
<body>
<script>
  /*
  * JS中的代码并不总是和我们想的那样按照代码书写顺序自上而下一行一行的获取结果
  * 会自上而下的执行 但是最后获得结果的顺序并不总是自上而下的
  *
  * 在代码块内总是先执行同步再执行异步 如果想先执行异步再执行同步的话只能将同步的逻辑放到异步里面
  * 更具体的是要放在异步的回调函数里面 因为JS的原生异步操作(定时器,ajax)都会配上回调函数
  *
  *
  * 异步就是代码不阻塞，这个在java中一般使用的是多线程来实现,比如WebSocket,开启端口后进行监听,
  * 之所以不会阻塞是因为运行到监听的时候Java会开启一个新的线程去监听不会阻塞主线程的执行
  *
  * 而在JS中没有多线程,为了在监听的时候不阻塞将这个操作委托给了其他模块进行(JS是单线程的但是浏览器不是单线程的)
  * 所以这并不会影响JS的主线程的执行,但所付出的代价就是JS在同步代码执行结束之后要不会的去监听事件队列里的回调函数
  * 类似Java中的自旋
  *
  * */


  /*
  * 像让异步先于同步的话只能让同步再异步回调函数的最后调用
  * 当然这里是约定大于配置
  *
  * */
  function async(f1,f2){
    f1(f2)
  }

  async(
    fn =>{
    setTimeout(()=>{
      console.log(1);
      fn()
    })
  },
    ()=>{
      console.log(2);
  })

  /*
  * 这样是无法实现先后顺序调用的
  * 因为可能f1是一个异步操作 那么f2总会在f1之前执行的
  * */
  function async1(f1,f2) {
    f1()
    f2()

  }


</script>
</body>
</html>